import { createLspPayService, CreateLspPayPayoutRequest } from '../src/services/lspPayService';
import { Logger } from '../src/utils/logger';

// 从环境变量加载配置
const config = {
  appId: process.env.LSPPAY_APP_ID || '',
  mchNo: process.env.LSPPAY_MCH_NO || '',
  apiKey: process.env.LSPPAY_API_KEY || '',
  baseUrl: process.env.LSPPAY_BASE_URL || '',
  notifyIp: process.env.LSPPAY_NOTIFY_IP || '103.140.154.27',
  notifyUrl: process.env.LSPPAY_PAYOUT_NOTIFY_URL || '',
};

async function testLspPayPayoutService() {
  console.log('🧪 开始测试 LSPPAY 代付服务...\n');

  // 验证配置
  if (!config.appId || !config.mchNo || !config.apiKey || !config.baseUrl) {
    console.error('❌ 错误: LSPPAY 配置不完整，请检查环境变量');
    console.log('\n需要的环境变量:');
    console.log('  - LSPPAY_APP_ID:', config.appId ? '✓' : '✗');
    console.log('  - LSPPAY_MCH_NO:', config.mchNo ? '✓' : '✗');
    console.log('  - LSPPAY_API_KEY:', config.apiKey ? '✓' : '✗');
    console.log('  - LSPPAY_BASE_URL:', config.baseUrl ? '✓' : '✗');
    process.exit(1);
  }

  console.log('📋 LSPPAY 配置信息:');
  console.log(`   商户号: ${config.mchNo}`);
  console.log(`   应用ID: ${config.appId}`);
  console.log(`   API地址: ${config.baseUrl}`);
  console.log(`   回调地址: ${config.notifyUrl}\n`);

  try {
    // 创建服务实例
    const lspPayService = createLspPayService();
    console.log('✅ LSPPAY 服务实例创建成功\n');

    // 生成测试订单号
    const orderId = lspPayService.generateOrderId();
    console.log(`✅ 订单号生成成功: ${orderId}\n`);

    // 测试案例1: 带银行编码的代付请求
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📝 测试案例 1: 带银行编码的代付请求');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    const payoutRequestWithBank: CreateLspPayPayoutRequest = {
      amount: 100.00,
      paymentMethod: 'BankTransfer',
      orderId: orderId,
      receiverName: 'Test User',
      receiverBankCard: '1234567890123456',
      bankCode: '002', // 曼谷银行
      remark: 'LSPPAY代付测试 - 带银行编码'
    };

    console.log('📦 代付请求参数:');
    console.log('   订单号:', payoutRequestWithBank.orderId);
    console.log('   金额:', payoutRequestWithBank.amount, 'THB');
    console.log('   支付方式:', payoutRequestWithBank.paymentMethod);
    console.log('   收款人:', payoutRequestWithBank.receiverName);
    console.log('   银行卡号:', payoutRequestWithBank.receiverBankCard);
    console.log('   银行编码:', payoutRequestWithBank.bankCode, '✅ (已提供)');
    console.log('   备注:', payoutRequestWithBank.remark);
    console.log('\n🚀 发送代付请求到 LSPPAY...\n');

    const result1 = await lspPayService.createPayoutOrder(payoutRequestWithBank);

    console.log('📨 LSPPAY 响应:');
    console.log('   响应码:', result1.code);
    console.log('   消息:', result1.msg);
    if (result1.data) {
      console.log('   转账ID:', result1.data.transferId);
      console.log('   商户订单号:', result1.data.mchOrderNo);
      console.log('   转账状态:', result1.data.state);
      if (result1.data.errCode) {
        console.log('   错误码:', result1.data.errCode);
        console.log('   错误信息:', result1.data.errMsg);
      }
    }

    if (result1.code === 0) {
      console.log('\n✅ 测试案例 1 通过: 带银行编码的代付请求成功\n');
    } else {
      console.log(`\n⚠️  测试案例 1 警告: API返回错误 - ${result1.msg}\n`);
    }

    // 等待2秒
    await new Promise(resolve => setTimeout(resolve, 2000));

    // 测试案例2: 不带银行编码的代付请求（对比测试）
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📝 测试案例 2: 不带银行编码的代付请求（对比）');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    const orderId2 = lspPayService.generateOrderId();
    const payoutRequestWithoutBank: CreateLspPayPayoutRequest = {
      amount: 100.00,
      paymentMethod: 'BankTransfer',
      orderId: orderId2,
      receiverName: 'Test User 2',
      receiverBankCard: '1234567890123456',
      // bankCode: undefined, // 不提供银行编码
      remark: 'LSPPAY代付测试 - 不带银行编码'
    };

    console.log('📦 代付请求参数:');
    console.log('   订单号:', payoutRequestWithoutBank.orderId);
    console.log('   金额:', payoutRequestWithoutBank.amount, 'THB');
    console.log('   支付方式:', payoutRequestWithoutBank.paymentMethod);
    console.log('   收款人:', payoutRequestWithoutBank.receiverName);
    console.log('   银行卡号:', payoutRequestWithoutBank.receiverBankCard);
    console.log('   银行编码:', payoutRequestWithoutBank.bankCode || 'undefined', '❌ (未提供)');
    console.log('   备注:', payoutRequestWithoutBank.remark);
    console.log('\n🚀 发送代付请求到 LSPPAY...\n');

    const result2 = await lspPayService.createPayoutOrder(payoutRequestWithoutBank);

    console.log('📨 LSPPAY 响应:');
    console.log('   响应码:', result2.code);
    console.log('   消息:', result2.msg);
    if (result2.data) {
      console.log('   转账ID:', result2.data.transferId);
      console.log('   商户订单号:', result2.data.mchOrderNo);
      console.log('   转账状态:', result2.data.state);
      if (result2.data.errCode) {
        console.log('   错误码:', result2.data.errCode);
        console.log('   错误信息:', result2.data.errMsg);
      }
    }

    if (result2.code === 0) {
      console.log('\n✅ 测试案例 2 通过: 不带银行编码的代付请求成功\n');
    } else {
      console.log(`\n⚠️  测试案例 2 警告: API返回错误 - ${result2.msg}\n`);
    }

    // 总结
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
    console.log('📊 测试总结');
    console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');

    console.log('测试案例 1 (带银行编码):');
    console.log(`   状态: ${result1.code === 0 ? '✅ 成功' : '❌ 失败'}`);
    console.log(`   响应: ${result1.msg}`);

    console.log('\n测试案例 2 (不带银行编码):');
    console.log(`   状态: ${result2.code === 0 ? '✅ 成功' : '❌ 失败'}`);
    console.log(`   响应: ${result2.msg}`);

    console.log('\n💡 结论:');
    if (result1.code === 0 && result2.code !== 0) {
      console.log('   ✅ 带银行编码的请求成功，不带银行编码的请求失败');
      console.log('   ✅ 验证了 bankCode 参数传递正常且为必需参数');
    } else if (result1.code === 0 && result2.code === 0) {
      console.log('   ⚠️  两种请求都成功，说明 bankCode 可能是可选参数');
    } else if (result1.code !== 0 && result2.code !== 0) {
      console.log('   ⚠️  两种请求都失败，可能是其他参数或配置问题');
    } else {
      console.log('   ⚠️  不带银行编码的请求成功，带编码的失败（异常情况）');
    }

    console.log('\n✅ 测试完成！\n');

  } catch (error) {
    console.error('\n❌ 测试过程中出现错误:', error);
    if (error instanceof Error) {
      console.error('错误详情:', error.message);
      console.error('错误堆栈:', error.stack);
    }
    process.exit(1);
  }
}

// 运行测试
testLspPayPayoutService().catch(error => {
  console.error('测试执行失败:', error);
  process.exit(1);
});